package com.ithuameng.admin.app.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ithuameng.admin.app.system.model.Role;
import com.ithuameng.admin.app.system.model.admin.qo.RoleQo;
import com.ithuameng.admin.app.system.model.admin.vo.UserRoleAuthVo;
import com.ithuameng.admin.enums.YesNo;

import java.util.List;
import java.util.Set;

/**
 * Role service
 *
 * @author ithuameng
 */
public interface IRoleService extends IService<Role> {

    IPage<Role> listRole(Page<Role> page, RoleQo roleQo);

    /**
     * 根据用户ID查询角色列表
     *
     * @param userId 用户编号
     * @return 角色列表
     */
    List<UserRoleAuthVo> selectRolesByUserId(Long userId);

    /**
     * 根据用户ID查询角色权限
     *
     * @param userId 用户编号
     * @return 权限列表
     */
    Set<String> selectRolePermissionByUserId(Long userId);

    /**
     * 校验角色是否有数据权限
     *
     * @param roleId 角色id
     */
    void checkRoleDataScope(Long roleId);

    /**
     * 校验角色名称是否唯一
     *
     * @param roleName   角色名称
     * @param execuldeId 排除角色编号
     * @return 结果
     */
    boolean checkRoleNameUnique(String roleName, Long execuldeId);

    /**
     * 校验角色权限是否唯一
     *
     * @param roleKey    角色权限
     * @param execuldeId 排除角色编号
     * @return 结果
     */
    boolean checkRoleKeyUnique(String roleKey, Long execuldeId);

    /**
     * 保存角色和角色菜单
     *
     * @param role    角色
     * @param menuIds 角色菜单
     */
    void saveRoleWithMenus(Role role, Long[] menuIds);

    /**
     * 更新角色和角色菜单
     *
     * @param role    角色
     * @param menuIds 角色菜单
     */
    void updateRoleWithMenus(Role role, Long[] menuIds);

    /**
     * 批量删除角色信息
     *
     * @param roleIds 需要删除的角色ID
     */
    void deleteRoleByIds(Long[] roleIds);

    /**
     * 修改角色状态
     *
     * @param roleId 角色编号
     * @param status 角色状态
     */
    void updateRoleStatus(Long roleId, YesNo status);
}
